perm filename BACKUP[2,DBL] blob
sn#016205 filedate 1972-12-17 generic text, type T, neo UTF8
00100 BEGIN
00200 EXPR ENTER();
00300 BEGIN
00400 PRINTSTR '"THE SYSTEM IS STARTED";
00500 S;PRINTSTR '"
00600
00700 PLEASE TYPE IN A REQUEST
00800
00900 ...";
01000 L←READ();
01100 LHOLD←L;
01200 IF NULL(L) THEN RETURN '"THE SYSTEM IS ENDED.";
01300 PRINT D(L);
01400 GO S;
01500 END;
01600 EXPR D(L);
01700 BEGIN NEW FN, A, N, RELATEDF;
01800 I←READINKNOWN();
01900 KNOWNF←IDATA[1];
02000 TARG←IDATA[2];
02100 NARG←IDATA[3];
02200 TRE←IDATA[4];
02300 BA1←IDATA[5];
02400 BA2←IDATA[6];
02500 FN←L[1];
02600 FN2←FN;
02700 A←CDR(L);
02800 N←LENGTH(A);
02900 RELATEDF←'(NIL NIL NIL NIL);
03000 IF MEMBER(FN,KNOWNF) THEN RETURN K1(FN,A,N,RELATEDF)
03100 ELSE RETURN K2(FN,A,N,RELATEDF);
03200 END;
03300 EXPR INIT();
03400 BEGIN
03500 UNKNOWN ←'UNKNOWN;
03600 INF←0;
03700 ORD←'(NIL);
03800 PRINTSTR '"TYPE IN HOW DEEPLY WE SHOULD RECURSE BEFORE
03900 GIVING UP AS INFINITE LOOP (I SUGGEST 50) ...";
04000 LIMINFBASE←READ();
04100 TWICELIMINF ← LIMINF + LIMINF;
04200 TRIPLELIMINF ← LIMINF + TWICELIMINF;
04300 BA1←'(FN CAR CDR IDEN MINUS ATOM LISTP NUMBERP NULL
04400 LIST CONST1 ZERO1
04500 QUOTE EVAL LENGTH NOT HALF SUB1 ADD1 );
04600 BA2←'(CONS PI12 PI22 FN2 LIST PLUS TIMES MEMBER APPEND
04700 GREATERP LESSP EQUAL AND OR NOT);
04800 PRINTSTR '"TYPE IN MESSAGE LEVEL (I SUGGEST 3)...";
04900 MSGLEVEL←READ();
05000 KNOWNF ←'(CAR CDR CONS IDEN
05100 PLUS TIMES MINUS
05200 ATOM LISTP NUMBERP NULL
05300 QUOTE EVAL
05400 LENGTH MEMBER
05500 GREATERP LESSP EQUAL
05600 AND OR NOT
05700 HALF PI12 PI22 ZERO1 ZERO2
05800 CONST1 CONST2 SUB1 ADD1 LIST APPEND FN FN2);
05900 SCHEMA←'(DE FN(L) (COND
06000 ((EQUAL (F1 L) C1) (F2 L))
06100 ((EQUAL (F8 L) C3) (F9 L))
06200 ((OR (GT L) (AND (INFINITY ) ((CAR (GET F4 TARGS)) (F3 L))
06300 ((CAR (GET F6 TARGS)) (F5 L))
06400 ((CAR (GET F7 TARGS)) (F4 (F3 L)))
06500 ((CADR (GET F7 TARGS)) (F6 (F5 L))) ))
06600 (F7 (F4 (F3 L)) (F6 (F5 L))))
06700 (T C2)));
06800 I ← EVAL(SCHEMA);
06900 I←GS2(); I←EVAL(SCHEMA2);
07000 NARGS←'NARGS; TARGS←'TARGS;TRES←'TRES;
07100 RETURN PUTFORM();
07200 END;
07300 EXPR IDEN(A); A;
07400 EXPR HALF(A); A/2;
07500 EXPR K1(FN,A,N,RELATEDF);
07600 BEGIN NEW I;
07700 I← GET(FN,'NARGS);
07800 IF I=N OR I=11 THEN RETURN EVAL(L);
07900 PRINTSTR '"THIS FUNCTION TAKES EXACTLY";
08000 PRIN1(I);
08100 PRINTSTR '" ARGUMENT(S), BUT YOU USED IT WITH";
08200 PRIN1(N); PRINTSTR '"ARGUMENT(S).
08300 ARE WE DEFINING A NEW BUT CLOSELY
08400 RELATED FUNCTION Y OR N ...";
08500 IF READ()='Y THEN RELATEDF[1,1]←FN
08600 ELSE PRINTSTR '"ARE WE DEFINING A NEW FUNCTION HERE OR
08700 NOT Y OR N ..."
08800 ALSO IF READ()='N THEN RETURN '"IGNORING THE REQUEST ENTIRELY";
08900 PRINTSTR '"PICK A NEW FUNCTION NAME TO REPLACE THIS NEWEST USE OF";
09000 PRIN1 FN;
09100 PRINTSTR '"...";
09200 FN←READ();
09300 FN2←FN;
09400 IF MEMBER(FN,KNOWNF) THEN RETURN K1(FN,A,N,RELATEDF)
09500 ELSE RETURN K2(FN,A,N,RELATEDF);
09600 END;
09700 EXPR K2(FN,A,N,RELATEDF);
09800 BEGIN NEW II,I;
09900 PRINTSTR '"READY TO MAKE NEW FUNCTION. DO YOU WANT TO";
10000 PRINTSTR '" CHANGE YOUR REQUEST Y OR N...";
10100 IF READ()='Y THEN RETURN '"VERY WELL. IGNORING
10200 THE REQUEST ENTIRELY";
10300 FOR NEW J←1 TO LENGTH(KNOWNF)-1 DO
10400 PUTPROP(KNOWNF[J],NIL,'RVAL);
10500 F1←NIL; F2←NIL; F3←NIL; F4←NIL; F5←NIL; F6 ←NIL;
10600 F7←NIL; F8←NIL;F9←NIL; F10←NIL; F11←NIL; F12←NIL;
10700 F13←NIL; F14←NIL; F15←NIL; F16←NIL; F17←NIL;
10800 F18←NIL; F19←NIL; EXAMPLE←NIL;
10900 CO←CDR(BA1); CO2 ←CDR(BA2);
11000 ORDER2←<BA2,CO,CO,BA2,CO,CO,BA2,CO,CO,BA2,CO,CO,
11100 BA2,BA2,CO,CO,BA2,CO,CO>;
11200 ORDER←<CO,CO,CO,BA1,CO,BA1,CO2>;
11300 PRINTSTR '"FOR EACH OF THE FOLLOWINGS FUNCTIONS, TYPE
11400 EITHER TH WORD STOP OR A FUNCTION NAME, A SPACE, AND THEN A
11500 1/2/3/4/5, MEANING THAT THE FN. IS DEFINITELY/PROBABLY/POSSIBLY
11600 /PROBABLY NOT/DEFINITELY NOT RELATED TO";
11700 PRIN1 (FN);
11800 PRINT (KNOWNF);
11900 FOR NEW J←1 TO LENGTH(KNOWNF) DO BEGIN
12000 S; I←READ();
12100 IF I= 'STOP THEN GO SSS;
12200 II←READ();
12300 PUTPROP (I, II, 'RVAL);
12400 IF MEMBER(II,'(1 2 3 4)) THEN
12500 RELATEDF[II] ← I CONS RELATEDF[II]
12600 ELSE IF NOT(II=5) THEN
12700 PRINTSTR '"NO,NO! TYPE IN ONE DIGIT FROM 1 TO 5!!!"
12800 ALSO GO S;
12900 SSS; END UNTIL I= 'STOP;
13000 PRINTSTR '"DO YOU THINK RECURSION (OR AN AUXILLIARY FN. WILL
13100 BE REQUIRED HERE Y OR N OR M(FOR MAYBE) ...";
13200 I←READ();
13300 IF I='Y THEN RETURN REC(FN,A,N,RELATEDF)
13400 ELSE RETURN NREC(FN,A,N,RELATEDF,I);
13500 END;
13600 EXPR PUTFORM();
13700 BEGIN NEW ID,NA,TA,TR;
13800 TF←NIL;
13900 IF MAKELISTS()=NIL THEN RETURN PRINTSTR '"MAKELISTS IS NIL";
14000 FOR NEW I←1 TO LENGTH(KNOWNF) DO
14100 BEGIN
14200 PF←NIL;
14300 PF[1]←'PF1; PF[2]←'PF2; PF[3]←'PF3; PF[4]← 'PF4;
14400 PF[5]←'PF5; PF[6]←'PF6; PF[7]←'PF7;
14500 PF[8]←'PF8; PF[9]←'PF9; P2F[1]←'P2F1; P2F[2]←'P2F2;
14600 P2F[3]←'P2F3; P2F[4]←'P2F4; P2F[5]←'P2F5; P2F[6]←'P2F6;
14700 P2F[7]←'P2F7; P2F[8]←'P2F8; P2F[9]←'P2F9;
14800 P2F[10]←'P2F10; P2F[11]←'P2F11;
14900 P2F[12]←'P2F12; P2F[13]←'P2F13; P2F[14]←'P2F14;
15000 P2F[15]←'P2F15; P2F[16]←'P2F16; P2F[17]←'P2F17;
15100 P2F[18]←'P2F18; P2F[19]←'P2F19;
15200 ID←KNOWNF[I];
15300 NA←NARG[I];
15400 PUTPROP(ID,NA,'NARGS);
15500 TA←TARG[I];
15600 PUTPROP(ID,TA,'TARGS);
15700 TR←TRE[I];
15800 PUTPROP(ID,TR,'TRES);
15900 FOR NEW J←1 TO 9 DO PUTPROP(ID,TF[J,I],PF[J]);
16000 FOR NEW J←1 TO 19 DO PUTPROP(ID,T2F[J],P2F[J]);
16100 PUTPROP('FN,2,'RVAL);
16200 PUTPROP ('FN2,2,'RVAL);
16300 PUTPROP('FALSE,'(ANY),TARGS);
16400 PUTPROP('FALSE2,'(ANY ANY), TARGS);
16500 END;
16600 END;
16700 EXPR MAKELISTS();
16800 BEGIN
16900 NARG ← '(1 1 2 11 11 11 1
17000 1 1 1 1 1 1 1 2 11 11 11 11 11 11 1 2 2 1
17100 2 1 2 1 1 11 2 1 2);
17200 TARG←'((LISTP) (LISTP) (ATOM LISTP) (ANY ANY)
17300 (NUMBER NUMBER) (NUMBER NUMBER)
17400 (NUMBER) (ANY) (ANY) (ANY) (ANY) (ANY) (ANY) (ANY)
17500 (ANY LISTP) (NUMBER NUMBER) (NUMBER NUMBER) (ANY ANY)
17600 (ANY ANY) (ANY ANY) (ANY ANY) (NUMBER) (ANY ANY) (ANY ANY)
17700 (ANY) (ANY ANY) (ANY) (ANY ANY) (NUMBER) (NUMBER)
17800 (ANY) (ANYLIST ANYLIST) (ANY) (ANY ANY));
17900 TRE←'(ANY LISTP LISTP ANY NUMBER NUMBER NUMBER
18000 TF TF TF TF ANY ANY
18100 NUMBER TF TF TF TF TF TF TF NUMBER ANY ANY NUMBER
18200 NUMBER ANY ANY NUMBER NUMBER ANYLIST LIST ANY ANY);
18300 TF[1]← '(7 7 0 5 0 0 14 5 14 14 10 25 14 10 0 0 0 0 0 0
18400 14 10 0 0 25 0 25 0 10 10 14 0 0);
18500 TF[2]← '(10 10 0 5 0 0 14 5 14 14 14 25 14 14 0 0 0 0 0 0
18600 25 10 0 0 10 0 10 0 14 14 7 0 0);
18700 TF[3] ← '(5 7 0 10 0 0 10 14 14 14 14 14 14 14 0 0 0 0 0 0
18800 25 14 0 0 14 0 14 0 7 7 10 0 0);
18900 TF[4] ← '(7 10 0 7 0 0 14 14 14 14 14 14 14 14 0 0 0 0 0 0
19000 14 10 0 0 25 0 25 0 10 10 14 0 5);
19100 TF[5] ← '(7 5 0 10 0 0 10 14 14 14 14 14 14 14 0 0 0 0 0 0
19200 25 14 0 0 14 0 14 0 7 7 7 0 0);
19300 TF[6] ← '(10 7 0 7 0 0 14 14 14 14 14 14 14 14 0 0 0 0 0 0
19400 14 10 0 0 25 0 25 0 10 10 10 0 5);
19500 TF[7] ← '(0 0 5 0 10 10 0 0 0 0 0 0 0 0 25 25 14 25 14 14
19600 0 0 7 7 0 14 0 14 0 0 0 5 0);
19700 TF[8]←TF[1]; TF[9]←TF[2];
19800 I←GETT2F();
19900 RETURN PRINTSTR '"SUCCESFUL END OF MAKELISTS";
20000 END;
20100 EXPR FALSE(A); NIL;
20200 EXPR TRUE(A); T;
20300 EXPR GETEX(N8);
20400 BEGIN NEW I;
20500 N9 ← LENGTH(EXAMPLE) + 1;
20600 IF N9=1 THEN RETURN PRIM(NIL);
20700 S; PRINTSTR '"PLEASE GIVE ME AN EXAMPLE.";
20800 PRINTSTR '" THE ARGUMENT LIST...";
20900 EXAMPLE[N9,1]←READ();
21000 PRINTSTR '"THE FUNCTION VALUE...";
21100 EXAMPLE[N9,2]←READ();
21200 PRINTSTR '"DID YOU MAKE AN ERROR? ";
21300 I←READ();
21400 IF I='Y THEN GO S;
21500 RETURN EXAMPLE[N9];
21600 END;
21700 EXPR PI12(A,B); A;
21800 EXPR PI22(A,B); B;
21900 EXPR ZERO1(A); 0;
22000 EXPR ZERO2(A,B); 0;
22100 EXPR CONST1(A); 1;
22200 EXPR CONST2(A,B); NIL;
22300 EXPR INFINITY();
22400 BEGIN
22500 INF←INF+1;
22600 RETURN LESSP(INF,LIMINF);
22700 END;
22800 EXPR REC(FN,A,N,RELATEDF);
22900 BEGIN
23000 NEW I,II,I1,I2,KK,JJ1,JJ2;
23100 S; PRINTSTR '"WHICH: TYPE AN R(RECURSION), A(AUX.FN.), OR
23200 B(BOTH)...";
23300 I←READ();
23400 IF NOT(MEMBER(I,'(R A B))) THEN
23500 PRINTSTR '"NO,NO!! TYPE R,A, OR B ONLY..."
23600 ALSO GO S;
23700 IF NOT I='R THEN RETURN '"O.K. LET'S WORK ON THE AUX.FN.
23800 TYPE IT IN AS IF IT WERE YOUR REQUEST:";
23900 IF N=2 THEN I←PRIM2() ELSE
24000 I←GETEX(1);
24100 NEX←0;
24200 PRINTSTR '"HOW MANY MORE EXAMPLES WILL YOU GIVE ME
24300 (I SUGGEST 2) ....";
24400 NEX←READ();
24500 FOR NEW KK←1 TO NEX DO II←GETEX(KK+1);
24600 L←CADAR(A);
24700 NEX ← NEX + ONEX;
24800 IF NOT(N=1) THEN RETURN REC2(FN,A,N,RELATEDF);
24900 I←'(ANY);
25000 E←NIL; MA←T; MN←T; MAL←T; EXAMPLE[NEX+2,1]←L;
25100 FOR NEW X←1 TO NEX+1 DO BEGIN E←EXAMPLE[X+1,1];
25200 MA←MA AND ATOM(E); MN←MN AND NUMBER(E);
25300 MAL←MAL AND ANYLIST(E); END;
25400 IF MAL THEN I←'(ANYLIST);
25500 IF MA THEN I←'(ATOM);
25600 IF MN THEN I←'(NUMBER);
25700 PUTPROP('FN,I,'TARGS);
25800 PUTPROP('FN,1,'NARGS);
25900 PUTPROP('FN,'ANY,'TRES);
26000 IHOLD←I;
26100 PRINTSTR '"DO YOU KNOW THE TYPE OF ARGUMENTS
26200 FOR THE FN? MY GUESS IS"; PRINC (IHOLD);
26300 PRINTSTR '"ANSWER Y IF YOU WANT TO MAKE A BETTER GUESS,
26400 N IF YOU THINK THAT IT IS O.K. AS STATED ... ";
26500 I←READ(); IF I='Y THEN BEGIN PRINTSTR '"O.K. TYPE IN ONE
26600 OF TH FOLLOWING WORDS: ANY ANYLIST LISTP NUMBER...";
26700 I←READ();
26800 PUTPROP('FN,<I>,'TARGS);
26900 IHOLD←<I>;
27000 END;
27100 FOR NEW K←1 TO 7 DO
27200 ORD[K]←INTERSECTION(RELATEDF[1]@
27300 RELATEDF[2]@<'FN>@RELATEDF[3]
27400 @RELATEDF[4],ORDER[K]);
27500 ORD[8]←ORD[1]; ORD[9]←ORD[2];
27600 FOR NEW K←1 TO 9 DO ORD[K]←RANK(K,ORD);
27700 PRINTSTR '"DO YOU WANT TO CUT DOWN THE POSSIBILITIES
27800 EVEN FURTHER? Y OR N ..."; I←READ();
27900 IF I='Y THEN FOR NEW X←1 TO 9 DO BEGIN
28000 PRINT (<'ORD,X,ORD[X]>); PRINTSTR '"NOW RETYPE ORD[X]";
28100 I ← READ(); IF NOT(I='S) THEN ORD[X]←I;
28200 END;
28300 IF C1=UNKNOWN THEN C1←T;
28400 IF C3=UNKNOWN THEN C3←T;
28500 I←NIL; II←NIL;
28600 LIMINF←LIMINFBASE;
28700 FOR NEW T1←1 TO LENGTH(ORD[1]) DO BEGIN
28800 F1←ORD[1,T1];
28900 IF GREATERP(MSGLEVEL,0) THEN
29000 PRINT(<1,'T1,T1,'F1,F1,'L,L,'RELATEDF,RELATEDF,'ORD,ORD>);
29100 IF FOR NEW X←2 TO NEX+1 ; AND BEGIN
29200 E←EXAMPLE[X,1];
29300 RETURN EVAL '((CAR (GET F1 TARGS)) E) ;
29400 END AND
29500 (GOODEX=NIL OR F1(GOODEX[1])=C1) THEN
29600 FOR NEW T2←1 TO LENGTH(ORD[2]) DO BEGIN
29700 F2←ORD[2,T2];
29800 IF GREATERP(MSGLEVEL,1) THEN
29900 PRINT(<2,'T2,T2,'F2,F2>);
30000 IF FOR NEW X←2 TO NEX+1; AND BEGIN
30100 E←EXAMPLE[X,1];
30200 RETURN EVAL '((CAR (GET F2 TARGS)) E) ;
30300 END AND
30400 (NOT(GOODEX) OR F2(GOODEX[1])=GOODEX[2]) THEN
30500 FOR NEW T8←1 TO LENGTH(ORD[8]) DO BEGIN
30600 F8←ORD[8,T8];
30700 IF GREATERP(MSGLEVEL,9) THEN PRINT(<8,'T8,T8,'F8,F8>);
30800 IF FOR NEW X←2 TO NEX+1; AND BEGIN
30900 E←EXAMPLE[X,1];
31000 RETURN EVAL '((CAR (GET F8 TARGS)) E); END AND
31100 (GOODEX2=NIL OR F8(GOODEX2[1])=C3) THEN
31200 FOR NEW T9←1 TO LENGTH(ORD[9]) DO BEGIN
31300 F9←ORD[9,T9];
31400 IF GREATERP (MSGLEVEL,10) THEN PRINT(<9,'T9,T9,'F9,F9>);
31500 IF FOR NEW X←2 TO NEX+1; AND BEGIN
31600 E←EXAMPLE[X,1];
31700 RETURN EVAL '((CAR (GET F9 TARGS)) E); END AND
31800 (NOT(GOODEX2) OR F9(GOODEX2[1])=GOODEX2[2]) THEN
31900 FOR NEW T3←1 TO LENGTH(ORD[3]) DO BEGIN
32000 F3←ORD[3,T3];
32100 IF GREATERP(MSGLEVEL,2) THEN
32200 PRINT(<3,'T3,T3,'F3,F3>);
32300 IF FOR NEW X←2 TO NEX+1; AND BEGIN
32400 E←EXAMPLE[X,1];
32500 RETURN ( GT(E) OR EVAL '((CAR (GET F3 TARGS)) E) );
32600 END THEN
32700 FOR NEW T4←1 TO LENGTH(ORD[4]) DO BEGIN
32800 F4←ORD[4,T4];
32900 IF F4='FN THEN LIMINF←TWICELIMINF;
33000 IF GREATERP(MSGLEVEL,3) THEN
33100 PRINT(<4,'T4,T4,'F4,F4,'GETF4TARGS,GET(F4,TARGS)>);
33200 IF FOR NEW X←2 TO NEX+1; AND BEGIN
33300 E←EXAMPLE[X,1];
33400 RETURN ( GT(E) OR EVAL '((CAR (GET F4 TARGS)) (F3 E) )) ;
33500 END THEN
33600 FOR NEW T5←1 TO LENGTH(ORD[5]) DO BEGIN
33700 F5←ORD[5,T5];
33800 IF GREATERP(MSGLEVEL,4) THEN
33900 PRINT (<5,'T5,T5,'F5,F5>);
34000 IF FOR NEW X←2 TO NEX+1; AND BEGIN
34100 E←EXAMPLE[X,1];
34200 RETURN (GT(E) OR EVAL '((CAR (GET F5 TARGS)) E)) ;
34300 END THEN
34400 FOR NEW T6←1 TO LENGTH(ORD[6]) DO BEGIN
34500 F6←ORD[6,T6];
34600 IF F6='FN THEN LIMINF ← TRIPLELIMINF;
34700 IF GREATERP(MSGLEVEL,5) THEN
34800 PRINT (<6,'T6,T6,'F6,F6,'(I HAVE CHOSEN LIMINF TO BE),LIMINF>);
34900 IF FOR NEW X←2 TO NEX+1; AND BEGIN
35000 E←EXAMPLE[X,1];
35100 RETURN ( GT(E) OR EVAL '((CAR (GET F6 TARGS)) (F5 E) )) ;
35200 END THEN
35300 FOR NEW T7←1 TO LENGTH(ORD[7]) DO BEGIN
35400 F7←ORD[7,T7];
35500 IF GREATERP(MSGLEVEL,6) THEN
35600 PRINT (<7,'T7,T7,'F7,F7>);
35700 JJ1← FOR NEW KK←2 TO NEX+2; AND BEGIN E←EXAMPLE[KK,1];
35800 RETURN (GT(E) OR
35900 EVAL('((CAR (GET F7 TARGS)) (F4 (F3 E))))); END;
36000 JJ2← FOR NEW HH←2 TO NEX+2; AND BEGIN E←EXAMPLE[HH,1];
36100 RETURN (GT(E) OR
36200 EVAL ('((CADR (GET F7 TARGS)) (F6 (F5 E)))))
36300 ; END;
36400 IF JJ1 AND JJ2 THEN INF←0
36500 ALSO I← FOR NEW X←2 TO NEX+1; AND BEGIN
36600 INF←0;
36700 E←EXAMPLE[X,1];
36800 RETURN (EXAMPLE[X,2] = EVAL '(FN E) );
36900 END;
37000 IF I THEN PRINTSTR '"
37100 HOORAY, HOORAY!!!
37200 SUCCESS!!
37300 ";
37400 RETURN I;
37500 END UNTIL I
37600 END UNTIL I
37700 END UNTIL I
37800 END UNTIL I
37900 END UNTIL I
38000 END UNTIL I
38100 END UNTIL I
38200 END UNTIL I
38300 END UNTIL I;
38400 IF GREATERP(MSGLEVEL,0) THEN
38500 PRINT <'F123456789,F1,F2,F3,F4,F5,F6,F7,F8,F9,'C1234,C1,C2,C3,C4>;
38600 KNOWNF← FN CONS KNOWNF; TARG ←GET('FN,'TARGS) CONS TARG;
38700 NARG←N CONS NARG; TRE ← GET('FN,'TRES) CONS TRE;
38800 BA1 ← FN CONS BA1; IF GREATERP(MSGLEVEL,2) THEN
38900 PRINT <'KNOWNF,KNOWNF,
39000 'TARGNARGTRE,TARG,NARG,TRE,'BA1,BA1>;
39100 FINALIZE();
39200 PUTPROP(FN,1,NARGS);
39300 PUTPROP(FN,IHOLD,TARGS);
39400 PUTPROP(FN,'(ANY),TRES);
39500 FOR NEW J←1 TO 9 DO PUTPROP(FN,11,PF[J]);
39600 RETURN FN
39700 END;
39800 EXPR GT(E);
39900 OR( GOODEX AND GOODEX[1]=E, GOODEX2 AND GOODEX2[1]=E);
40000 EXPR INTERSECTION(A,B);
40100 BEGIN NEW III;
40200 III←NIL;
40300 FOR NEW JJJ IN A DO
40400 IF MEMBER(JJJ,B) THEN III← III @ <JJJ>;
40500 RETURN III;
40600 END;
40700 EXPR LISTP(A);AND( NOT(ATOM(A)), LENGTH(A) ≥ 1);
40800 EXPR ANY(A); T;
40900 EXPR NUMBER(A); NUMBERP(A);
41000 EXPR ANYLIST(A);OR(NULL(A),NOT(ATOM(A)));
41100 EXPR PRINTMATRIX();
41200 BEGIN NEW J;
41300 PRINTSTR '"FNAME TF1 TF2 TF3 TF4 TF5 TF6 TF7 TF8 TF9";
41400 FOR NEW I IN KNOWNF DO BEGIN
41500 J← FOR NEW K IN PF COLLECT
41600 <GET(I,K)>;
41700 RETURN PRINT (I CONS J);
41800 END;
41900 END;
42000 EXPR PRIM(NIL);
42100 BEGIN NEW I,I1,I2;
42200 GOODEX←NIL;
42300 GOODEX2 ← NIL;
42400 F8←NIL;
42500 F9←NIL;
42600 ONEX ← 0;
42700 F1 ← NIL;
42800 F2 ← NIL;
42900 PRINTSTR '"THERE IS SOME TRIVIAL (PRIMITIVE) CASE (OR TWO).
43000 DO YOU KNOW ANYTHING ABOUT IT? Y OR N ...";
43100 I ← READ();
43200 IF I ='N THEN BEGIN
43300 IF GREATERP(MSGLEVEL,1) THEN PRINTSTR
43400 '"ASSUMING C1 TO BE T, C2 TO BE UNKNOWN";
43500 C1 ← T; C2 ← UNKNOWN;
43600 C3←T; C4←UNKNOWN;
43700 EXAMPLE[1] ← <C1,C2>;
43800 RETURN NIL; END ALSO RETURN NIL;
43900 PRINTSTR '"FOR SOME FUNCTIONS F1,F2 AND SOME CONSTANTS C1,C2
44000 WHEN F1(ARGUMENT)=C1 THEN THE VALUE OF YOUR FN IS C2=F2(ARG)
44100 NOTE: C2 MAY NOT ACTUALLY BE A CONSTANT (JUST TYPE UNKNOWN)
44200
44300 NOW TYPE IN A FUNCTION NAME OR THE WORD NIL FOR F1,F2
44400 AND A CONSTANT OR TH WORD UNKNOWN FOR C1,C2 :
44500 F1 ...";
44600 F1←READ();
44700 PRINTSTR '" F2 ...";
44800 F2 ← READ();
44900 PRINTSTR '" C1 ...";
45000 C1 ← READ();
45100 PRINTSTR '" C2 ...";
45200 C2 ← READ();
45300 EXAMPLE[1] ← <C1,C2>;
45400 PRINTSTR '"CAN YOU GIVE ME AN EXAMPLE OF THIS TRIVIAL CASE? ";
45500 PRINTSTR '"Y OR N ...";
45600 I ← READ();
45700 IF I='Y THEN I←GETEX(2) ALSO ONEX←1 ALSO GOODEX←EXAMPLE[2];
45800 IF GOODEX AND F1 THEN C1←F1(GOODEX[1]);
45900 IF GOODEX AND F2 THEN C2←F2(GOODEX[1]);
46000 PRINTSTR '"IS THERE ANOTHER TRIVIAL CASE? Y OR N...";
46100 I←READ();
46200 IF I='N THEN BEGIN
46300 C3←T; C4←UNKNOWN;
46400 F8←'FALSE; F9←'FALSE;
46500 END
46600 ALSO RETURN NIL;
46700 PRINTSTR '"FOR SOME FUNCTIONS F8,F9, AND SOME CONSTANTS C3,C4
46800 WHEN F8(ARGUMENT)=C3 HEN THE VALUE OF YOUR FUNCTION
46900 IS C3=F9(ARGUMENT)
47000 NOTE: C4 MAY NOT ACTUALLY BE A CONSTANT (SAY UNKNOWN)
47100
47200 AS BEFORE, TYPE IN SOMETHING FOR ....
47300 F8 F9 C3 C4 HERE:";
47400 F8←READ();F9←READ();C3←READ();C4←READ();
47500 PRINTSTR '"CAN YOU GIVE ME AN EXAMPLE OF THIS TRIVIAL CASE?
47600 Y OR N ...";
47700 I←READ();
47800 IF I='Y THEN I←GETEX(3) ALSO ONEX←ONEX+1 ALSO GOODEX2←EXAMPLE[3];
47900 IF GOODEX2 AND F8 THEN C3←F8(GOODEX2[1]);
48000 IF GOODEX2 AND F9 THEN C4←F9(GOODEX2[1]);
48100 RETURN NIL; END;
48200 EXPR RANK(K,LL);
48300 BEGIN NEW VAL,TEMP,OLDR,RL;
48400 L←LL;
48500 IF NULL(L[K]) THEN
48600 (IF K=7 THEN RETURN '(PI22) ELSE RETURN '(IDEN));
48700 IF FSUB(K) THEN RETURN <FSUB(K)>;
48800 VAL←NIL;
48900 II←NIL;
49000 II←L[K];
49100 L←II;
49200 LEN ← LENGTH(L);
49300 OLDL←L;
49400 FOR NEW II ←1 TO LEN DO
49500 BEGIN
49600 I←L[II];
49700 IF MEMBER(I,KNOWNF) AND
49800 GET(I,'RVAL) AND
49900 GET(I, PF[K]) AND NOT(GET(I,PF[K])=0) THEN
50000 VAL[II] ← TIMES( GET(I,PF[K]), GET(I,'RVAL))
50100 ELSE VAL[II] ← 1000;
50200 END;
50300 IF GREATERP(MSGLEVEL,20) THEN
50400 PRINT(<'VAL,VAL,'L,L>);
50500 FOR NEW KOUNTER←1 TO LEN DO
50600 FOR NEW I1←1 TO LEN-1 DO
50700 FOR NEW I2←I1+1 TO LEN DO
50800 IF GREATERP(VAL[I1],VAL[I2]) THEN BEGIN
50900 TEMP←VAL[I1]; VAL[I1]←VAL[I2]; VAL[I2]←TEMP;
51000 TEMP←L[I1]; L[I1]←L[I2]; L[I2]←TEMP;
51100 END;
51200 RL←L;
51300 TEMP← FOR NEW J←1 TO LEN COLLECT
51400 BEGIN IF VAL[J]=1000 THEN RETURN NIL
51500 ELSE RETURN <L[J]>;
51600 END;
51700 L ← TEMP;
51800 IF GREATERP(MSGLEVEL,9) THEN PRINT (<'OLDL,OLDL,'RANKEDL,
51900 RL, 'CHOPPEDL, L>);
52000 RETURN L;
52100 END;
52200 EXPR FINALIZE();
52300 BEGIN
52400 IF F4='FN THEN F4←FN; IF F6='FN THEN F6←FN;
52500 EVAL <'DE, FN, '(L),
52600 <'COND, <<'EQUAL, <F1, 'L>, C1>, <F2,'L>>,
52700 <<'EQUAL, <F8, 'L>, C3>, <F9, 'L>>,
52800 <'T,<F7, <F4, <F3, 'L>>,
52900 <F6, <F5, 'L>>>>>>;
53000 RETURN KEEP();
53100 END;
53200 EXPR PERMANENT();
53300 BEGIN NEW I;
53400 EVAL '(OUTC (OUTPUT DSK: PW1KNOWNF) NIL);
53500 PRINT(<KNOWNF,TARG,NARG,TRE,
53600 BA1,BA2> );
53700 EVAL '(OUTC NIL T);
53800 END;
53900 EXPR KEEP();
54000 BEGIN NEW I;
54100 PRINTSTR '"THE ANSWER TO YOUR REQUEST IS";
54200 PRINT (EVAL(LHOLD));
54300 PRINTSTR '"
54400
54500 DO YOU WISH TO ENTER THIS FUNCTION AS A PERMANENT PART
54600 OF THE SYSTEM? Y OR N...";
54700 I←READ();
54800 IF I='N THEN RETURN NIL;
54900 I← PERMANENT();
55000 IF GREATERP(MSGLEVEL,23) THEN PRINT
55100 (<'KNOWNF,KNOWNF,'TARG,TARG,'NARG,NARG,'TRE,TRE,'BA1,
55200 BA1,'BA2,BA2>);
55300 RETURN NIL; END;
55400 EXPR READINKNOWN();
55500 BEGIN NEW I;
55600 I←EVAL '(INC (INPUT DSK: PW1KNOWNF) NIL);
55700 IDATA←NIL;
55800 IDATA← READ();
55900 I←EVAL '(INC NIL T);
56000 IF GREATERP(MSGLEVEL ,24) THEN PRINT (<'IDATA,
56100 IDATA>);
56200 RETURN NIL; END;
56300 EXPR GETT2F();
56400 BEGIN
56500 T2F[1]← '(0 0 14 0 25 25 0 0 0 0 0 0 0 0 25 14 14 25 14
56600 14 0 0 7 7 0 25 0 25 0 0 25 25 0 25);
56700 TF[2] ← '(10 10 0 7 0 0 25 14 14 14 14 25 25 14 0 0 0 0 0
56800 0 25 14 0 0
56900 25 0 25 0 10 10 25 0 0 0);
57000 TF[3] ← TF[2];
57100 TF[4] ← '(0 0 10 0 25 25 0 0 0 0 0 0 0
57200 0 25 25 25 25 25 25 0 0 7 7 0 25 0
57300 25 0 0 24 14 0 14);
57400 TF[5] ← '(10 10 0 7 0 0 14 25 25 25 25 25 25 25 0
57500 0 0 0 0 0 25 25 0 0
57600 14 0 10 0 14 14 14 0 0 0);
57700 TF[6]← '(10 10 0 7 0 0 14 25 25 25 25 25 25 25 0
57800 0 0 0 0 0 25 25 0 0
57900 25 0 10 0 14 14 14 0 0 0);
58000 TF[7]← TF[1];
58100 TF[8]← TF[2];
58200 TF[9] ← TF[3];
58300 TF[10] ← TF[4];
58400 TF[11] ← TF[5];
58500 TF[12] ← TF[6];
58600 TF[13] ← '(0 0 10 0 25 25 0 0 0 0 0 0 0 0 25 25 25 25 25 14
58700 0 0 14 14 0 25 0 25 0 0 25 20 0 14);
58800 TF[14] ← '(0 0 14 0 25 25 0 0 0 0 0 0 0 0 25 15 15 15 15 25 0
58900 0 7 10 0 25 0 25 0 0 24 20 0 10);
59000 TF[15] ← '(7 10 0 10 0 0 14 25 25 25 25 25 25 25 0 0 0 0 0
59100 0 25 25 0 0 25 0 25 0 14 14 0 0 0 0);
59200 TF[16] ← TF[15];
59300 TF[17] ← TF[14];
59400 TF[18] ← '(10 7 0 10 0 0 14 25 25 25 25 25 25 25 0 0 0 0 0 0
59500 25 25 0 0 25 0 25 0 14 14 0 0 0 0 );
59600 TF[19] ← TF[18];
59700 END;
59800 EXPR GS2();
59900 BEGIN
60000 SCHEMA2 ← '(DE FN2(L M) (COND
60100 ((AND ((CAR (GET F2 TARGS)) L)
60200 ((CAR (GET F3 TARGS)) M)
60300 ((CAR (GET F1 TARGS)) (F2 L))
60400 ((CADR (GET F1 TARGS)) (F3 M))
60500 (EQUAL (F1 (F2 L) (F3 M)) C1)
60600 ((CAR (GET F5 TARGS)) L)
60700 ((CAR (GET F6 TARGS)) M)
60800 ((CAR (GET F4 TARGS)) (F5 L))
60900 ((CADR (GET F4 TARGS)) (F6 M)))
61000 (F4 (F5 L) (F6 M)))
61100 ((AND ((CAR (GET F8 TARGS)) L)
61200 ((CAR (GET F9 TARGS)) M)
61300 ((CAR (GET F7 TARGS)) (F8 L))
61400 ((CADR (GET F7 TARGS)) (F9 M))
61500 (EQUAL (F7 (F8 L) (F9 M)) C3)
61600 ((CAR (GET F11 TARGS)) L)
61700 ((CAR (GET F12 TARGS)) M)
61800 ((CAR (GET F10 TARGS)) (F11 L))
61900 ((CADR (GET F10 TARGS)) (F12 M)))
62000 (F10 (F11 L) (F12 M) ) )
62100
62200 ((OR (GT2 L M)
62300 (AND (INFINITY)
62400 ((CAR (GET F16 TARGS)) M)
62500 ((CAR (GET F15 TARGS)) L)
62600 ((CAR (GET F14 TARGS)) (F15 L))
62700 ((CADR (GET F14 TARGS)) (F16 M))
62800 ((CAR (GET F18 TARGS)) L)
62900 ((CAR (GET F19 TARGS)) M)
63000 ((CAR (GET F17 TARGS)) (F18 L))
63100 ((CADR (GET F17 TARGS)) (F19 M))
63200 ((CAR (GET F13 TARGS))
63300 (SETQ &E1 (F14 (F15 L) (F16 M))))
63400 ((CADR (GET F13 TARGS))
63500 (SETQ &E2 (F17 (F18 L) (F19 M))))))
63600 (F13 &E1 &E2))
63700 (T C2) ) )))));
63800 IF GREATERP(MSGLEVEL, 54) THEN PRINTSTR '" SCHEMA TWO IS";
63900 IF GREATERP(MSGLEVEL, 53) THEN PRINT (SCHEMA2);
64000 RETURN NIL;
64100 END;
64200 EXPR REC2(FN,A,N,RELATEDF);
64300 BEGIN NEW I,II,I1,I2,KK,JJ1,JJ2;
64400 EE1←NIL;
64500 EE2 ← NIL;
64600 L1← NIL;
64700 L2 ← NIL;
64800 E←NIL;
64900 MA←T;
65000 MN←T;
65100 MAL←T;
65200 MA2 ←T;
65300 MN2←T;
65400 MAL2←T;
65500 E1←NIL;
65600 E2←NIL;
65700 EXAMPLE[NEX+2,1]←L;
65800 FOR NEW X←1 TO NEX+1 DO BEGIN
65900 E1← EXAMPLE[X+1,1,1];
66000 E2← EXAMPLE[X+1,1,2];
66100 MA← MA AND ATOM(E1);
66200 MA2← MA2 AND ATOM(E2);
66300 MN ← MN AND NUMBER(E1);
66400 MN2 ← MN2 AND NUMBER(E2);
66500 MAL ← MAL AND ANYLIST(E1);
66600 MAL2 ← MAL2 AND ANYLIST(E2);
66700 END;
66800 I← '(ANY ANY);
66900 IF MAL THEN I[1] ← 'ANYLIST;
67000 IF MAL2 THEN I[2] ← 'ANYLIST;
67100 IF MA THEN I[1] ← 'ATOM;
67200 IF MA2 THEN I[2] ← 'ATOM;
67300 IF MN THEN I[1] ← 'NUMBER;
67400 IF MN2 THEN I[2] ← 'NUMBER;
67500 PUTPROP ('FN2, I, 'TARGS);
67600 PUTPROP ('FN2, 2, 'NARGS);
67700 PUTPROP ('FN2, 'ANY, 'TRES);
67800 IHOLD← I;
67900 PRINTSTR '"DO YOU KNOW THE TYPE OF ARGUMENTS FOR THE FN?
68000 MY GUESS IS";
68100 PRINC (IHOLD);
68200 PRINTSTR '" ANSWER N MEANS GUESS IS OK,
68300 ANSWER Y MEANS YOU WANT TO CHANGE MY GUESS ...";
68400 I←READ();
68500 IF I='Y THEN BEGIN
68600 PRINTSTR '"TYPE IN TWO OF THE WORDS:
68700 ANY ANYLIST NUMBER LISTP
68800 ( LISTP MEANS A NONNULL LIST)...";
68900 I ← READ();
69000 II ← READ();
69100 IHOLD ← <I,II>;
69200 PUTPROP('FN2, IHOLD, 'TARGS);
69300 END;
69400 FOR NEW K←1 TO 19 DO
69500 ORD[K]←INTERSECTION(RELATEDF[1]@RELATEDF[2]@<'FN2>
69600 @RELATEDF[3]@RELATEDF[4], ORDER2[K]);
69700 FOR NEW K←1 TO 19 DO
69800 ORD[K] ← RANK(K,ORD);
69900 PRINTSTR '"DO YOU WANT TO CUT DOWN THE POSSIBILITIES?";
70000 I←READ();
70100 IF I='Y THEN FOR NEW X←1 TO 19 DO
70200 BEGIN
70300 PRINT <'ORD,X,ORD[X]>;
70400 PRINTSTR '"NOW RETYPE THIS SECTION OF ORD:";
70500 I←READ();
70600 IF NOT(I='S) THEN ORD[X]←I;
70700 END;
70800 IF C1='UNKNOWN THEN C1=T;
70900 IF C3='UNKNOWN THEN C3=T;
71000 I←NIL; II←NIL;
71100 LIMINF←LIMINFBASE;
71200 TAGF1 ← F1;
71300 TAGF7 ← F7;
71400 FOR NEW T2 ← 1 TO LENGTH(ORD[2]) DO BEGIN
71500 F2 ← ORD[2,T2];
71600 IF GREATERP(MSGLEVEL,0) THEN
71700 PRINT <2,'T2,T2,'F2,F2>;
71800 IF GREATERP(MSGLEVEL,49) THEN
71900 PRINT<'L,L,'RELATEDFUNCTIONS,RELATEDF,'ORD,ORD>;
72000 IF FOR NEW X← 2 TO NEX+1; AND
72100 MAT(EXAMPLE[X,1],F2) THEN
72200 FOR NEW T3 ← 1 TO LENGTH(ORD[3]) DO BEGIN
72300 F3←ORD[3,T3];
72400 IF GREATERP(MSGLEVEL,1) THEN
72500 PRINT <3,'T3,T3,'F3,F3>;
72600 IF FOR NEW X←2 TO NEX+1; AND
72700 MAT3(EXAMPLE[X,1],F3) THEN
72800 FOR NEW T1←1 TO LENGTH(ORD[1]) DO BEGIN
72900 F1← ORD[1,T1];
73000 IF GREATERP(MSGLEVEL,2) THEN PRINT <1,'T1,T1,'F1,F1>;
73100 IF FOR NEW X←2 TO NEX+1; AND
73200 MAT2(EXAMPLE[X,1],F1,F2,F3) AND
73300 (TAGF1 OR GOODEX=NIL OR F1(F2 (GOODEX[1,1],
73400 F3(GOODEX[1,2]))=C1) THEN
73500 FOR NEW T5←1 TO LENGTH(ORD[5]) DO BEGIN
73600 F5 ← ORD[5,T5];
73700 IF GREATERP(MSGLEVEL,4) THEN PRINT<5,'T5,T5,'F5,F5>;
73800 IF FOR NEW X←2 TO NEX+1; AND MAT(EXAMPLE[X,1],F5) THEN
73900 FOR NEW T6←1 TO LENGTH(ORD[6]) DO BEGIN
74000 F6 ← ORD[6,T6];
74100 IF GREATERP(MSGLEVEL,5) THEN PRINT <6,'T6,T6,'F6,F6>;
74200 IF FOR NEW X←2 TO NEX+1; AND MAT3(EXAMPLE[X,1],F6) THEN
74300 FOR NEW T4← 1 TO LENGTH(ORD[4]) DO BEGIN
74400 F4←ORD[4,T4];
74500 IF GREATERP(MSGLEVEL,6) THEN PRINT <4,'T4,T4,'F4,F4>;
74600 IF FOR NEW X←2 TO NEX+1; AND
74700 MAT2(EXAMPLE[X,1],F4,F5,F6) AND
74800 (LENGTH(ORD[4])=1 OR C2=NIL OR C2=UNKNOWN
74900 OR F4(F5(L),F6(M))=C2) THEN
75000 FOR NEW T8←1 TO LENGTH(ORD[8]) DO BEGIN
75100 F7←ORD[7,T7];
75200 IF(GREATERP(MSGLEVEL,6)) THEN PRINT <7,'T7,T7,'F7,F7>;
75300 IF FOR NEW X←2 TO NEX+1; AND MAT(EXAMPLE[X,1],F7) THEN
75400 FOR NEW T9←1 TO LENGTH(ORD[9]) DO BEGIN
75500 F9 ← ORD[9,T9];
75600 IF GREATERP(MSGLEVEL,7) THEN PRINT <9,'T9,T9,'F9,F9>;
75700 IF FOR NEW X←2 TO NEX+1; AND MAT3(EXAMPLE[X,1],F9) THEN
75800 FOR NEW T7←1 TO LENGTH(ORD[7]) DO BEGIN
75900 F7←ORD[7,T7];
76000 IF GREATERP(MSGLEVEL,8) THEN PRINT <7,'T7,T7,'F7,F7 >;
76100 IF FOR NEW X←2 TO NEX+1; AND
76200 MAT2(EXAMPLE[X,1],F7,F8,F9) AND
76300 (TAGF7 OR GOODEX2=NIL OR
76400 F7(F8(GOODEX2[1,1]),F9(GOODEX2[1,2]))=C3) THEN
76500 FOR NEW T11←1 TO LENGTH(ORD[11]) DO BEGIN
76600 F11←ORD[11,T11];
76700 IF GREATERP(MSGLEVEL,9) THEN PRINT <11,'T11,T11,'F11,F11>;
76800 IF FOR NEW X←2 TO NEX+1; AND MAT(EXAMPLE[X,1],F11) THEN
76900 FOR NEW T12←1 TO LENGTH(ORD[12]) DO BEGIN
77000 F12←ORD[12,T12];
77100 IF GREATERP(MSGLEVEL,10) THEN PRINT <12,'T12,T12,'F12,F12>;
77200 IF FOR NEW X←2 TO NEX+1; AND MAT3(EXAMPLE[X,1],F12) THEN
77300 FOR NEW T10←1 TO LENGTH(ORD[10]) DO BEGIN
77400 F10←ORD[10,T10];
77500 IF GREATERP(MSGLEVEL,11) THEN PRINT <12,'T12,T12,'F12,F12>;
77600 IF FOR NEW X←2 TO NEX+1; AND MAT2(EXAMPLE[X,1],F10,F11,F12) THEN
77700 FOR NEW T15← 1 TO LENGTH(ORD[15]) DO BEGIN
77800 F15← ORD[15,T15];
77900 IF GREATERP(MSGLEVEL,12) THEN PRINT <15,'T15,T15,'F15,F15>;
78000 IF FOR NEW X←2 TO NEX+1; AND MAT(EXAMPLE[X,1],F15) THEN
78100 FOR NEW F16←1 TO LENGTH(ORD[16]) DO BEGIN
78200 F16←ORD[16,T16];
78300 IF GREATERP(MSGLEVEL,13) THEN PRINT <16,'T16,T16,'F16,F16>;
78400 IF FOR NEW X←2 TO NEX+1; AND MAT3(EXAMPLE[X,1],F16) THEN
78500 FOR NEW T14←1 TO LENGTH(ORD[14]) DO BEGIN
78600 F14←ORD[14,T14];
78700 IF GREATERP(MSGLEVEL,14) THEN PRINT <14,'T14,T14,'F14,F14>;
78800 IF FOR NEW X←2 TO NEX+1; AND MAT2(EXAMPLE[X,1],F14,F15,F16) THEN
78900 FOR NEW T18←1 TO LENGTH(ORD[18]) DO BEGIN
79000 F18←ORD[18,T18];
79100 IF GREATERP(MSGLEVEL,15) THEN PRINT <18,'T18,T18,'F18,F18>;
79200 IF FOR NEW X←2 TO NEX+1; AND MAT(EXAMPLE[X,1],F18) THEN
79300 FOR NEW T19←1 TO LENGTH(ORD[19]) DO BEGIN
79400 F19←ORD[19,T19];
79500 IF GREATERP(MSGLEVEL,16) THEN PRINT <19,'T19,T19,'F19,F19>;
79600 IF FOR NEX X←2 TO NEX+1; AND MAT3(EXAMPLE[X,1],F19) THEN
79700 FOR NEW T17←1 TO LENGTH(ORD[17]) DO BEGIN
79800 F17←ORD[17,T17];
79900 IF GREATERP(MSGLEVEL,17) THEN PRINT <17,'T17,T17,'F17,F17>;
80000 IF FOR NEW X←2 TO NEX+1; AND MAT2(EXAMPLE[X,1],F17,F18,F19) THEN
80100 FOR NEW T13←1 TO LENGTH (ORD[13]) DO BEGIN
80200 F13←ORD[13,T13];
80300 IF GREATERP(MSGLEVEL,18) THEN PRINT <13,'T13,T13,'F13,F13>;
80400 IF FOR NEW X←2 TO NEX+1; AND
80500 BEGIN L1←EXAMPLE[X,1,1]; L2←EXAMPLE[X,1,2];
80600 I← ( EVAL '((CAR (GET F13 TARGS))
80700 (SETQ &E1 (F14 (F15 L1) (F16 L2))))
80800 AND
80900 EVAL '((CADR (GET F13 TARGS))
81000 (SETQ &E2 (F17 (F18 L1) (F19 L2)))) );
81100 INF←0;
81200 IF I THEN I← FOR NEW X←2 TO NEX+1; AND
81300 EVAL '(FN2 &E1 &E2) = EXAMPLE[X,2];
81400 IF I THEN PRINTSTR '" HOORAY, HOORAY
81500 SUCCESS";
81600 RETURN I;
81700 END UNTIL I
81800 END UNTIL I
81900 END UNTIL I
82000 END UNTIL I
82100 END UNTIL I
82200 END UNTIL I
82300 END UNTIL I
82400 END UNTIL I
82500 END UNTIL I
82600 END UNTIL I
82700 END UNTIL I
82800 END UNTIL I
82900 END UNTIL I
83000 END UNTIL I
83100 END UNTIL I
83200 END UNTIL I
83300 END UNTIL I
83400 END UNTIL I
83500 END UNTIL I;
83600 IF GREATERP(MSGLEVEL,0) THEN
83700 PRINT <'F1TOF19,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,
83800 F11,F12,F13,F14,F15,F16,F17,F18,F19,'C1234,C1,C2,
83900 C3,C4>;
84000 KNOWNF ← FN2 CONS KNOWNF;
84100 TARG ← GET('FN,'TARGS) CONS TARG;
84200 NARG← N CONS NARG;
84300 TRE ← GET('FN,'TRES) CONS TRE;
84400 BA2 ← FN2 CONS BA2;
84500 IF GREATERP(MSGLEVEL,35) THEN PRINT <'KNOWNF,KNOWNF,
84600 'RELATESDF,RELATEDF,'TARG,TARG,'NARG,NARG,'TRE,
84700 TRE,'BA2,BA2>;
84800 PUTPROP(FN2,2,NARGS);
84900 PUTPROP(FN2,IHOLD,TARGS);
85000 PUTPROP(FN2,'ANY,TRES);
85100 FINALIZE2();
85200 FOR NEW J←1 TO 19 DO PUTPROP(FN2,11,P2F[J]);
85300 RETURN FN2;
85400 END;
85500 EXPR PRIM2();
85600 BEGIN NEW I;
85700 GOODEX ← NIL;
85800 GOODEX2 ← NIL;
85900 ONEX ← 0;
86000 F1 ← NIL
86100 F12 ← NIL
86200 F3 ← NIL
86300 F2 ← NIL;
86400 F4 ← NIL;
86500 F5 ← NIL;
86600 F6 ← NIL;
86700 F7 ← NIL;
86800 F8 ← NIL;
86900 F9←NIL;
87000 F10 ← NIL;
87100 F11 ← NIL;
87200 PRINTSTR '"THERE IS SOME PRIMITIVE CASE (OR TWO).
87300 DO YOU KNOW ANYTHING ABOUT IT? Y OR N...";
87400 I← READ();
87500 IF I='N THEN BEGIN
87600 IF GREATERP(MSGLEVEL,3) THEN PRINTSTR
87700 '"I AM ASSUMING F1 THROUGH F12 TO BE NIL,
87800 C1 AND C3 TO BE T, C2 AND C4 TO BE UNKNOWN";
87900 C1 ←T;
88000 C3← T;
88100 C2← UNKNOWN;
88200 C4 ← UNKNOWN;
88300 EXAMPLE[1] ←<C1,C2>;
88400 RETURN NIL;
88500 END ALSO RETURN NIL;
88600 PRINTSTR '"FOR SOME FUNCTIONS F1,F2,F3,F4,F5,F6,
88700 AND SOME CONSTANT C1, WHEN
88800 F1( F2(ARG1), F3(ARG2) ) = C1 THEN
88900 THE VALUE OF YOUR FUNCTION IS
89000 F4( F5(ARG1), F6(ARG2) ) = C2
89100
89200 NOW TYPE IN NIL OR A FUNCTION NAME FOR F1,F2,F3,F4,F5,F6:";
89300 F1←READ();
89400 F2←READ();
89500 F3←READ();
89600 F4←READ();
89700 F5←READ();
89800 F6←READ();
89900 PRINTSTR '"NOW TYPE IN A CONSTANT OR THE VALUE UNKNOWN FOR C1";
90000 C1←READ();
90100 PRINTSTR '"IF C2 IS A CONSTANT, TYPE IN ITS VALUE. IF IT
90200 IS NOT CONSTANT, OR IF YOU DONT KNOW THE VALUE,TYPE UNKNOWN";
90300 C2←READ();
90400 EXAMPLE[1]←<C1,C2>;
90500 PRINTSTR '"CAN YOU GIVE ME AN EXAMPLE OF THIS
90600 PRIMITIVE CASE? Y OR N...";
90700 I←READ();
90800 IF I='Y THEN I←GETEX(2) ALSO ONEX←1 ALSO GOODEX←EXAMPLE[2];
90900 PRINTSTR '"IS THERE ANOTHER PRIMITICE CASE? Y OR N...";
91000 I←READ();
91100 IF I='N THEN BEGIN
91200 C3←T;
91300 C4←UNKNOWN;
91400 F7←'FALSE2;
91500 F8←'FALSE;
91600 F9←'FALSE;
91700 F10←'FALSE2;
91800 F11←'FALSE;
91900 F12←'FALSE;
92000 END ALSO RETURN NIL;
92100 PRINTSTR '"FOR SOME FUNCTIONS F7,F8,F9,F10,F11,F12,
92200 AND SOME CONSTANT C3, WHEN
92300 F7( F8(ARG1), F9(ARG2) ) = C3 THEN
92400 THE VALUE OF YOUR FUNCTION IS
92500 F10( F11(ARG1), F12(ARG2) ) = C4
92600
92700 NOW TYPE IN NIL OR A FUNCTION NAME FOR F7 THROUGH F12:";
92800 R`F7←READ();
92900 F8←READ();
93000 F9←READ();
93100 F10←READ();
93200 F11←READ();
93300 F12←READ();
93400 PRINTSTR '"NOW TYPE IN UNKNOWN OR A CONSTANT FOR C3,C4:";
93500 C3←READ();
93600 C4←READ();
93700 PRINTSTR '"CAN YOU GIVE ME AN EXAMPLE OF THIS? Y OR N>>>";
93800 I←READ();
93900 IF I='Y THEN I←GETEX(3) ALSO ONEX←2 ALSO GOODEX2←EXAMPLE[3];
94000 RETURN NIL;
94100 END;
94200 EXPR FSUB(I);
94300 IF I=1 THEN F1
94400 ELSE IF I=2 THEN F2
94500 ELSE IF I=3 THEN F3
94600 ELSE IF I=4 THEN F4
94700 ELSE IF I=5 THEN F5
94800 ELSE IF I=6 THEN F6
94900 ELSE IF I=7 THEN F7
95000 ELSE IF I=8 THEN F8
95100 ELSE IF I=9 THEN F9
95200 ELSE IF I=10 THEN F10
95300 ELSE IF I=11 THEN F11
95400 ELSE IF I=12 THEN F12
95500 ELSE IF I=13 THEN F13
95600 ELSE IF I=14 THEN F14
95700 ELSE IF I=15 THEN F15
95800 ELSE IF I=16 THEN F16
95900 ELSE IF I=17 THEN F17
96000 ELSE IF I=18 THEN F18
96100 ELSE IF I=19 THEN F19
96200 ELSE PRINT <'FSUBERROR,'I,I>;
96300 EXPR FINALIZE2();
96400 BEGIN
96500 FOR NEW I←1 TO 19 DO
96600 IF F1='FN2 THEN F1←FN2;
96700 IF F4='FN2 THEN F4←FN2;
96800 IF F7='FN2 THEN F7←FN2;
96900 IF F10='FN2 THEN F10←FN2;
97000 IF F13='FN2 THEN F13←FN2;
97100 IF F14='FN2 THEN F14←FN2;
97200 IF F17='FN2 THEN F17←FN2;
97300 EVAL <'DE, FN2, '(L M),
97400 <'COND, <<'EQUAL, <F1, <F2, 'L>,<F3,'M>>,C1>,
97500 <F4, <F5, 'L>,<F6, 'M>>>,
97600 <<'EQUAL,<F7,<F8,'L>,<F9,'M>>,C3>,
97700 <F10,<F11,'L>,<F12,'M>>>,
97800 <T,<F13,<F14,<F15,'L>,<F16,'M>>,
97900 <F17,<F18,'L>,<F19,'M>>>>>>;
98000 RETURN KEEP();
98100 END;
98200 EXPR FALSE2(A B); NIL;
98300 EXPR GT2(L M); OR(GOODEX AND GOODEX[1,1]=L AND GOODEX[1,2]=M,
98400 GOODEX2 AND GOODEX2[1,1]=L AND GOODEX2[1,2]=M);
98500 EXPR MAT(E F);
98600 GT2(CAR(E),CADR(E)) OR
98700 EVAL '((CAR (GET F TARGS)) (CAR E));
98800 EXPR MAT2(E F G1 G2);
98900 GT2(CAR(E),CADR(E)) OR
99000 EVAL '((CAR (GET F TARGS)) (G1 (CAR E))) AND
99100 EVAL '((CADR (GET F TARGS)) (G2 (CADR E));
99200 EXPR FALSE2(A B); NIL;
99300 EXPR MAT3(E F);
99400 GT2(CAR(E),CADR(E)) OR
99500 EVAL '((CAR (GET F TARGS)) (CADR E));
99600 END.